package com.aizuda.encrypt.jsqlparse.visitor;

import cn.hutool.core.util.StrUtil;
import com.aizuda.encrypt.jsqlparse.entity.JSQLCryptExpression;
import com.aizuda.encrypt.util.ParseSQLUtil;
import lombok.extern.slf4j.Slf4j;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.expression.JdbcParameter;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;

import java.util.List;

/**
 * 访问处理
 *
 * @author nn200433
 * @date 2024-03-25 09:34:10
 */
@Slf4j
public class VisitorHandle {

    protected List<JSQLCryptExpression> list;

    public VisitorHandle(List<JSQLCryptExpression> list) {
        this.list = list;
    }

    /**
     * 处理程序
     *
     * @param leftExpression  左边达式
     * @param rightExpression 右边表达
     * @return
     * @author nn200433
     */
    protected void handler(Column leftExpression, Expression rightExpression, String sql) {
        final boolean isNotNull   = null != leftExpression;
        final boolean isJdbcParam = rightExpression instanceof JdbcParameter;
        if (isNotNull && isJdbcParam) {
            final JdbcParameter jdbcParameter = (JdbcParameter) rightExpression;
            final Integer       index         = jdbcParameter.getIndex();
            final String        columnName    = leftExpression.getColumnName();
            final Table         table         = leftExpression.getTable();
            final String        alias         = ParseSQLUtil.getAlias(table);
            JSQLCryptExpression dto           = new JSQLCryptExpression();
            if (StrUtil.isBlank(alias)) {
                log.warn("---> [Mybatis SQL 拦截器] 解析查询条件 『 {} 』，字段 {} 未设置归属表别名，默认使用 t 做为字段归属表的别名...", sql, columnName);
                dto.setAlias("t");
                dto.setIsUseTAsAlias(Boolean.TRUE);
            } else {
                dto.setAlias(alias);
            }
            dto.setColumnName(columnName);
            dto.setIndex(index);
            dto.setSql(sql);
            list.add(dto);
            log.debug("---> [Mybatis SQL 拦截器] 解析查询条件 『 {} 』 | 下标 = {} ， 字段名 = {} ， 归属表 = {}", sql, index, columnName, alias);
        }
    }

}
